﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using RzCorportativo.Lib;

namespace RzCorportativo.Views.Cadastros
{
    [System.Web.Script.Services.ScriptService]
    [Lib.Permissao(HasValidation = true)]
    public partial class Curriculo : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                if (!BasePage.IsAuthenticate)
                    return;
                var __curriculo = (Lib.Curriculo.Listar(new Lib.Curriculo()
                {
                    UsuarioId = (AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId
                }).FirstOrDefault() ?? new Lib.Curriculo());
                this.CurriculoId.Value = __curriculo.CurriculoId.ToString();
                this.dadosGeraisCurriculo.LoadModel(__curriculo);
                this.itemConhecimento.LoadUserItens(AppSession.Login.Usuario.ItensConhecimento);
                this.Indicacoes.Load(Lib.Indicacao.Listar(new Lib.Indicacao(){
                    UsuarioIndicadoId = __curriculo.UsuarioId, Status = 1, Vaga = new Lib.Vaga(){ Status = 1 } 
                }));
                Func<Lib.Indicacao, bool> func = (indicacao) =>
                {
                    return indicacao.ResultadoFinal == 1 && indicacao.Status == 1 && indicacao.Vaga.Status == 1;
                };
                Action<Lib.Indicacao, ButtonItem<Lib.Indicacao>> action = (indicacao, item) =>
                {
                    if (item.Id.Contains("btnFeedBack"))
                    {
                        //item.Id += "$" + indicacao.VagaId + "$" + indicacao.UsuarioIndicadoId + "$" + indicacao.DataCadastro.Date.ToString("dd/MM/yyyy");
                        item.OnClientClick = "ObterFeedback(" + indicacao.VagaId + ", " + indicacao.UsuarioIndicadoId + ", { Day: " + indicacao.DataCadastro.Day + 
                            ", Month: " + indicacao.DataCadastro.Month + ", Year: " + indicacao.DataCadastro.Year + "}, this);";
                    }
                    else if (item.Id.Contains("btnAceitar"))
                        item.OnClientClick = "Aceitar(" + indicacao.VagaId + ", " + indicacao.UsuarioIndicadoId + ", { Day: " + indicacao.DataCadastro.Day +
                            ", Month: " + indicacao.DataCadastro.Month + ", Year: " + indicacao.DataCadastro.Year + "}, this);";
                    else if (item.Id.Contains("btnRecuar"))
                        item.OnClientClick = "Recusar(" + indicacao.VagaId + ", " + indicacao.UsuarioIndicadoId + ", { Day: " + indicacao.DataCadastro.Day +
                            ", Month: " + indicacao.DataCadastro.Month + ", Year: " + indicacao.DataCadastro.Year + "}, this);";
                };
                //this.Indicacoes.AddButton(new ButtonItem<Lib.Indicacao>() { Type="button", Id="btnFeedBack", CssClass = "btn btn-primary", Text = "feedback", OnCreateValidation = func, OnCreate = action });
                this.Indicacoes.AddButton(new ButtonItem<Lib.Indicacao>() { Type = "button", Id = "btnAceitar", CssClass = "btn btn-success", Text = "aceitar", OnCreateValidation = func, OnCreate = action });
                this.Indicacoes.AddButton(new ButtonItem<Lib.Indicacao>() { Type = "button", Id = "btnRecuar", CssClass = "btn btn-danger", Text = "recusar", OnCreateValidation = func, OnCreate = action });
            }
        }

        [WebMethod]
        public static object ListarIdiomas(string termo)
        {
            var lista = Lib.Idioma.Listar(new Lib.Idioma()
            {
                Nome = termo
            });
            return lista.Select(s => new { value = s.Nome, label = s.Nome, IdiomaId = s.IdiomaId, Nome = s.Nome }).ToList();
        }

        [WebMethod]
        public static object ListarCursos(string termo)
        {
            var lista = Lib.Curso.Listar(new Lib.Curso()
            {
                Nome = termo
            });
            return lista.Select(s => new { value = s.Nome, label = s.Nome, CursoId = s.CursoId, Nome = s.Nome }).ToList();
        }

        [WebMethod]
        public static object RemoveIdiomaUsuario(int idiomaId, int usuarioId)
        {
            IdiomaUsuario idiomaUsuario = new IdiomaUsuario();
            idiomaUsuario.IdiomaId = idiomaId;
            idiomaUsuario.UsuarioId = usuarioId;
            try
            {
                string erros = string.Empty;
                if (idiomaUsuario.IdiomaId.Equals(0))
                    erros += "Idioma inválido";
                if (idiomaUsuario.UsuarioId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                if (idiomaUsuario.Excluir())
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item excluido com sucesso!" },
                        Show = true
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }

        [WebMethod]
        public static object AddIdiomaUsuario(int idiomaId, string nivel)
        {
            IdiomaUsuario idiomaUsuario = new IdiomaUsuario();
            idiomaUsuario.IdiomaId = idiomaId;
            idiomaUsuario.UsuarioId = (AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId;
            idiomaUsuario.Nivel = nivel;
            try
            {
                string erros = string.Empty;
                if (idiomaUsuario.IdiomaId.Equals(0))
                    erros += "Idioma inválido";
                if (string.IsNullOrEmpty(idiomaUsuario.Nivel))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Nivel inválido";
                if (idiomaUsuario.UsuarioId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                if (idiomaUsuario.Salvar())
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }

        [WebMethod]
        public static object AddFormacao(Lib.Formacao formacao)
        {
            try
            {
                if (formacao == null)
                    throw new Exception("O objeto fornecido não pode ser nulo");
                formacao.UsuarioId = (AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId;
                string erros = string.Empty;
                if (formacao.AnoInicio.Equals(0))
                    erros += "Ano de inicio inválido";
                if (formacao.CursoId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Curso inválido";
                if (string.IsNullOrEmpty(formacao.Instituicao))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Instituição inválida";
                if (formacao.Endereco.CidadeId == 0)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Cidade inválida";
                if (formacao.UsuarioId == 0)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                if (formacao.Salvar())
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = formacao.FormacaoId
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true,
                        Value = 0
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true,
                    Value = 0
                };
            }
        }

        [WebMethod]
        public static object RemoveFormacao(int formacaoId)
        {
            var formacao = new Formacao();
            formacao.FormacaoId = formacaoId;
            try
            {
                if (formacao.Excluir())
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item excluido com sucesso!" },
                        Show = true
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }

        [WebMethod]
        public static object ListarCargos(string termo)
        {
            var lista = Lib.Cargo.Listar(new Lib.Cargo()
            {
                Nome = (termo ?? string.Empty).ToUpper()
            });
            return lista.Select(s => new { value = s.Nome, label = s.Nome, CargoId = s.CargoId, Nome = s.Nome }).ToList();
        }

        [WebMethod]
        public static object AddCargoUsuario(int curriculoId, int cargoId)
        {
            try
            {
                string erros = string.Empty;
                if (cargoId.Equals(0))
                    erros += "Código do cargo inválido";
                if (curriculoId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Curriculo inválido";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                var curriculo = new Lib.Curriculo();
                curriculo.CurriculoId = curriculoId;
                var cargo = new Lib.Cargo();
                cargo.CargoId = cargoId;
                if (curriculo.AddCargoPretendido(cargo))
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = cargo.CargoId
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true,
                        Value = 0
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true,
                    Value = 0
                };
            }
        }

        [WebMethod]
        public static object RemoveCargoUsuario(int cargoId, int curriculoId)
        {
            var curriculo = new Lib.Curriculo();
            curriculo.CurriculoId = curriculoId;
            try
            {
                if (curriculo.RemoveCargo(new Lib.Cargo()
                    {
                        CargoId = cargoId
                    }))
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item excluido com sucesso!" },
                        Show = true
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }

        [WebMethod]
        public static object SalvarCurriculo(Lib.Curriculo curriculo)
        {
            try
            {
                if (curriculo == null)
                    throw new Exception("O objeto fornecido não pode ser nulo");
                curriculo.UsuarioId = (AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId;
                string erros = string.Empty;
                if (curriculo.PretencaoSalarial.Equals(-1))
                    erros += "Pretenção salarial inválido";
                if (curriculo.DisponibilidadeHorario.Equals(-1))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Disponibilidade de horário inválido";
                if (curriculo.UsuarioId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválida, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                if (curriculo.Salvar())
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = curriculo.CurriculoId
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true,
                        Value = 0
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true,
                    Value = 0
                };
            }
        }

        [WebMethod]
        public static object AddExperiencia(Lib.Experiencia experiencia)
        {
            try
            {
                if (experiencia == null)
                    throw new Exception("O objeto fornecido não pode ser nulo");
                string erros = string.Empty;
                if (experiencia.DataAdmissao.Equals(0))
                    erros += "Ano de inicio inválido";
                if ((AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId == 0)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (experiencia.CargoId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Cargo inválido";
                if (string.IsNullOrEmpty(experiencia.Empresa))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Empresa inválida";
                if (experiencia.DataAdmissao == DateTime.MinValue)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Data início inválido";
                if(experiencia.DataAdmissao > DateTime.Now)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Data início inválido, não pode ser maior que " + DateTime.Now.ToString("dd/MM/yyyy");
                if (!experiencia.EmpregoAtual && experiencia.DataDemissao == DateTime.MinValue)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Data fim inválida";
                if(experiencia.DataDemissao.HasValue && experiencia.DataAdmissao > experiencia.DataDemissao)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Data de início não pode ser maior que data fim";
                if (experiencia.DataDemissao.HasValue && experiencia.DataDemissao > DateTime.Now)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Data fim inválida, não pode ser maior que " + DateTime.Now.ToString("dd/MM/yyyy");
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                if (experiencia.Salvar())
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = experiencia.ExperienciaId
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true,
                        Value = 0
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true,
                    Value = 0
                };
            }
        }

        [WebMethod]
        public static object RemoveExperiencia(int experienciaId)
        {
            var experiencia = new Lib.Experiencia();
            experiencia.ExperienciaId = experienciaId;
            try
            {
                if (experiencia.Excluir())
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item excluido com sucesso!" },
                        Show = true
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }
        
        [WebMethod]
        public static object AddItemUsuario(Lib.ItemAreaConhecimento item)
        {
            try
            {
                if (item == null)
                    throw new Exception("O objeto fornecido não pode ser nulo");
                string erros = string.Empty;
                if ((AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId == 0)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (item.ItemAreaConhecimentoId == -1) 
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Código de item inválido";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };
                
                if (AppSession.Login.Usuario.AdicionarHabilidade(item))
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }

        [WebMethod]
        public static object RemoveItemUsuario(Lib.ItemAreaConhecimento item)
        {
            try
            {
                if (item == null)
                    throw new Exception("O objeto fornecido não pode ser nulo");
                string erros = string.Empty;
                if ((AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId == 0)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (item.ItemAreaConhecimentoId == -1)
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Código de item inválido";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                if (AppSession.Login.Usuario.RemoverHabilidade(item))
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item excluído sucesso!" },
                        Show = true
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }

    }
}